<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
  <script>
    //   class A{
    //       constructor(props){
    //           console.log('A---',props);
    //           this.x = props
    //       }

    //       getX(){
    //           console.log(this.x);
    //       }
    //   }

    //   class B extends A{
    //       constructor(props){
    //           super(props)
    //         //Must call super cnstructor in derived class before accessing 'this' or returning from derived constructor
    //         console.log('B---',props);
    //         // B实例添加私有属性
    //         this.y = 200
    //         //一样
    //         this.z = 3000
    //       }
    //       // 等同于 
    //     //   z = 300
          
    //       getY(){
    //         console.log(this.y);
    //       }   
    // }
          
    //   //b 实例
    //   let b = new B(100)
    //   console.log(b);
    //   console.log(b.x); //100

    //   console.log(B.prototype);
    //   console.log(b.__proto__);
    //   console.log(B.prototype===b.__proto__); //true

    //   console.log(B.prototype.getY);
    //   console.log(b.__proto__.getY);
  </script>

<!-- new 原理 -->
 <script>
   //对象 类 实例
   // 原型和原型链

  //  类和函数区别：都是函数 ，调用方式不同 

  // 函数执行
  // function f(){
  //   console.log(this); //window
  //   let a = 10
  //   this.b = a+10   // window.b
  // }

  // f()
  
  //类是特殊函数
  // function c(){
  //   console.log(this); //c 实例 =>{}
  //   let a = 10
  //   this.b = a+10  // {b:20}
  // }

   // 函数调用方式 ，函数执行的方式就不同
  // let c1 = new c()
  // console.log(c1);
// ----------------------------------------------------------------
  //new 调用函数的 执行顺序
  // function c(){
  //   // 内部：实例化对象 let obj = {} <=实例
  //   // 内部：该表this指向，this=>obj
  //   // 外部：执行代买
  //   console.log(this); //c 实例 =>{}
  //   let a = 10
  //   this.b = a+10  // {b:20}
  //   // 内部：默认返回 obj  // {b:20}
  // }

  // let c1 =new c()= return {b:20}

// -----------------------------------------------------
  //new 调用函数的，修改返回值
  function c(){
    console.log(this); //c 实例对象 =>{}
    let a = 10
    this.b = a+10  // {b:20}

    // 注: 自定义返回数据 ，数据类型 =>引用数据类型  覆盖默认类返回的实例对象
    //                             => 不是引用数据类型 返回默认的类的实例对象
    // return {a:10}
    // return 10
  }

  // let c1 = new c()
  // console.log(c1);

  // -------------------------------------------
  // new 调用函数的 执行顺序
  function C(){
    // 内部：实例化对象 let obj = {} <=实例
    // 内部：该表this指向，this=>obj
    // 外部：执行代买
    console.log(this); //c 实例 =>{}
    let a = 10
    this.b = a+10  // {b:20}
    // 内部：默认返回 obj  // {b:20}
  }

  let c1  = new C()
  let c2  = new C()
  console.log(c1);
  console.log(c2);
  console.log(c1===c2); // false  每次new 时候=>创建一个新的实例对象[堆内存：aaafff001,aaafff002]

  // ------------------------------------------------------------------
 
  // 实例(对象)是类的实例
  console.log(c1 instanceof C);
  console.log(c2 instanceof C);

  // -------------------------------------------------------------------
 

 </script>
  
</body>
</html>